Matthew Thomas has posted an article identifying additional reasons that open source software has poor usability. Unlike the previous list, this one is more specific to the open source development model. (Failing to design the interface before coding is a problem that also affects commercial software.)
I believe both of these lists have missed the biggest reason for poor usability: difficulty of coding. Creating custom controls and behaviors are more time consuming than using whatever common controls are provided. Common controls are therefore frequently misused. When the interface is designed in advance, developers have a good idea for how things should work and can plan to create custom widgets as necessary. However, if developers are just hacking something up to be functional, as likely as not they’ll just use any easily coded control whether or not it is appropriate. This is especially evident with the standard Yes/No dialogs. Even with excellent interface design, developers will often take a shortcut and use a control that is easier to code than writing a special one as dictated.
In an ironic twist, the converse is also likely, especially with multiplatform products. Instead of using a system standard common control, developers go out of their way to create widgets that work on all platforms, but resemble the common ones. Inconsistencies between platforms and expected behaviors yield additional user confusion and frustration. The problem is still the same: lack of developer energy invested in completely duplicating expected platform behavior.