Part of the problem is that many people who switched to Linux to get away from Windows don't understand Unix, and tend to expect (and implement!) programs that are based on the Windows GUI model. Unfortunately, it's poorly suited to designing programs in the Unix style. This leads to monolithic GUI programs that will only work if you're already using GNOME / KDE / etc., rather than programs that take advantage of existing the Unix programming infrastructure. (This seems to be less of a problem in the BSD community.)
It's possible to write a separate GUI interface wrapper for programs whose primary interface is a command line or C API, but the Windows programming culture doesn't seem to emphasize keeping them as separate layers the way that Unix does.