In D3D's defence, they had a number of optional features in D3D9, but developers really got to loathing the caps, so it was mostly abandoned for D3D10+.
As to D3D9's 'set functionality', it's true that Microsoft tried to lock down what you could add to the API. But you should check out Aras' D3D9 cheat sheet for hacked-in functionality. While there aren't any easy vectors for adding extra functionality to D3D9, that hasn't stopped ATI and NVIDIA from offering stuff through some of the weirdest and ugliest hacks imaginable. (Let's have a round of applause for the tesselation factor and point parameter render states, shall we?)
That having been said, I wholeheartedly agree that OpenGL has provided a much cleaner approach to extensibility of the API.