I don't agree with you. The success of the PC industry has been because of this high flexibility.
The problem I have with the Linux kernel, is that as a programmer, the abstraction isn't of a high enough level, so a lot of stuff needs to be done by the desktop environment. Maybe there should be a layer between the kernel and the desktop environment, or the level of abstraction should be much higher within the kernel itself.
My knowledge is somewhat dated, as I left Linux land about 5 years ago, but my problem was that often the abstraction stopped at the level of character/block device, while I wanted to talk to "scanner"/"modem"/"TVtuner"/"camera".
Without good abstraction at that level, there is no way for a device manufacturer to write a proper driver, and then I'm not even touching the binary/source debate.
There is no way to expand the interfaces, as the capabilities of a type of devices expand, if the kernel doesn't even have an abstraction at that level.