Hi there. I'm not a dev, but I can answer a few of these until someone more relevant comes along!
I have to use GL11 if I want a 1.1 method [...]
If I was using 1.5, [...] static imports [...]
Yes, you need to use the correct GL* object for your call. Yes, it will be wonderful when static import arrives. Yes, it's going to be a bit of a pain until that happens.
The decision was made that LWJGL will be best used in a 1.5 environment, so the API is oriented towards making things easier for such developers. It's a bit of a pain for 1.4 users, but you should get used to it pretty quick. Also there is another choice available to you:
The lack of multiple inheritance, [...] means I can't even create an equivalent GL class that handles all the versions up to the version that I care about.
You don't need inheritance to do that. Create your own GL class with whatever calls you want to use, and make those calls invoke the appropiate method on the appropiate GL* class.
If you prefer a single class holding all OpenGL methods, it shouldn't be hard to set up. In fact, then you get a lot more visibility over which methods you're using.
1) The fact that the GLU functions take native arrays, and the GL functions take NIO buffers. Calling glGetDouble() to get my projection matrix gives me an NIO buffer, which I then have to convert to a 2d native array before I can pass it to gluProject.
It was decided that the GLU will most often be called from Java code using arrays. So yes, unfortunately you'll need to perform an extra conversion step if you want to pass the GLU data from the GL.
[...] 5) The set of function name changes for GLxx seems inconsistent. glRotatef still exists, even though there isn't anything you can do except for floats, but glLightfv becomes glLight.[...] Secondly, porting code becomes more painful, as you have to go in and fix all the differing API names.
It seems a bit odd, but there's method to the (perceived) madness.
All methods whose arguments leave you in
no doubt as to which method is being asked for have had the suffices removed. In general, this means that
only methods that take NIO buffers have been stripped. The problem is that of automatic widening conversions - the devs found that they caused enough hassle that it was worthwhile making the argument type explicit in the method name.
Whether or not this is a good decision comes down to personal opinion. However, note that if you decide to create your own GL proxy class, you can name the methods however you like, including stripping or returning all method suffices.
Hope you find some of this useful!