glGetIntegerv(GL_MAX_TEXTURE_UNITS,...) is lying

why is it that my call to glGetIntegerv(GL_MAX_TEXTURE_UNITS,…) returns a value of 4, when my GeForceFX 5600 supports 16 textures per pass?

It tells you the truth. The GeforceFX-Line will not expose all it’s pipelines under the fixed function. To access all it’s texture passes, you’ll have to access them in a fragment program/shader.