Você pode facilmente desenvolver desenvolvimento de plataforma cruzada, seja um programador de sistemas, desenvolvedor da Web ou desenvolvedor de aplicativos de desktop. Se você gosta de sistemas, é provável que todos os utilitários e / ou drivers que você escreve para o Linux funcionem bem para outros * nix com modificações mínimas. Desde que você escreva o código C padrão e não use muitas chamadas específicas do sistema, elas podem ser fáceis de portar para o Windows.
Se você é um desenvolvedor de aplicativos para desktop, pode segmentar GTK, QT ou wxWidgets e provavelmente seu aplicativo funcionará bem nas três principais plataformas de hoje (* nix, Windows, Mac). Novamente, reduza ao mínimo as chamadas específicas do sistema ou isole-as em uma biblioteca de wrapper que será específica do sistema. Você também pode segmentar uma máquina virtual como a JVM e / ou CLR, que permitirá que o aplicativo funcione de maneira geral.
Se você é um desenvolvedor da Web, provavelmente encontrará muitas alternativas diferentes para escolher. Prefiro um pequeno servidor web chamado Cherokee e desenvolvo e executo aplicativos ASP.NET (mono) e Django que executam nele e usam um back-end 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 tiver como destino uma VM. O outro ponto é que você pode encontrar o The Paradox of Choice e não saber o que usar. Para isso leia abaixo a minha resposta para a segunda pergunta.
Quanto à segunda pergunta, 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.