Couldn't you just iterate over all properties in `uniforms` and figure out the options for each material that way?  They are all going to be numbers, correct?  We would just need to add additional information so each material knows it's min/max values and you should be able to do exactly what you described above.