I'm a PC developer looking to get into development for OpenGL ES devices.

In the PC world, I used Direct3D. For Direct3D, there is a single SDK that you download from Microsoft and you develop your application against that SDK. Users can then take my Direct3D program and run it on any Direct3D-compliant hardware, and get hardware accelerated graphics - it doesn't matter whether their hardware is from ATI, Nvidia, Intel, etc. It "just works" on all hardware.

From what I have seen, this is not the case for OpenGL ES (I'm looking primarily at Windows Mobile, but I don't suppose it would be different for other platforms). That is, there doesn't seem to be a single, unified, OpenGL ES implementation anywhere. For example, PowerVR provides an implementation which only works on their hardware. Qualcomm provides another implementation which only works on their hardware. And so on. Considering the wide variety of hardware available which is OpenGL ES compliant, this seems like pure insanity.

Doesn't this mean that I will have to compile many, many different versions of my application? Or, at the very least, perform a runtime check to load the correct implementation depending on the hardware my program is running on?

On the PC, a Direct3D application can be hardware-agnostic. That is, it doesn't care what it's running on - Direct3D will forward your API calls to the driver and the driver deals with it (sends it to hardware for processing, or whatever). Why doesn't OpenGL ES work this way? Or am I misunderstanding the way OpenGL ES implementations work?