Você pode fazer facilmente o desenvolvimento de plataforma cruzada, independentemente de ser um programador de sistemas, um desenvolvedor da Web ou um desenvolvedor de aplicativos de área de trabalho. Se você estiver em sistemas, então quaisquer utilitários e / ou drivers que você escrever para o Linux provavelmente funcionarão bem para outros * nix com modificações mínimas. Contanto que você escreva código C padrão e não use muitas chamadas específicas do sistema, elas podem ser até fáceis de migrar para o Windows.
Se você for um desenvolvedor de aplicativos de desktop, poderá segmentar GTK, QT ou wxWidgets, e seu aplicativo provavelmente funcionará bem nas três principais plataformas atuais (* nix, Windows, Mac). Novamente, mantenha as chamadas específicas do sistema ao mínimo ou isole-as em uma biblioteca de wrapper que será específica do sistema. Você também pode direcionar uma máquina virtual como a JVM e / ou o CLR, o que permitirá que o aplicativo funcione em todos os lugares.
Se você é um desenvolvedor web, é provável que você tenha muitas alternativas diferentes para escolher. Eu prefiro um pequeno servidor chamado Cherokee e eu desenvolvo e executo aplicativos ASP.NET (mono) e Django que são executados nele e use um back-end do PgSQL.
Portanto, a conclusão é que o desenvolvimento de plataforma cruzada no Linux pode ser feito, desde que você possa compilar o código na plataforma de destino e tenha isso em mente ao escrever seu código ou se você segmentar uma VM. O outro ponto é que você pode encontrar o Paradoxo da Escolha e não saber o que usar. Para isso, leia abaixo minha resposta à segunda questão.
Quanto à segunda questão, o melhor recurso que encontrei é chamado de Alternativas de código aberto . Este site lista softwares comerciais e suas alternativas de código aberto. Quase todas as alternativas rodam no Linux e no FreeBSD.