A terminação -a para o feminino e -o para o masculino já vêm do latim. Inicialmente, no latim clássico, não eram marcadores de género, mas foi essa função que acabaram por adquirir, quer no português, como no castelhano e no italiano; no italiano, apenas no singular. Esta evolução do latim para as modernas línguas românicas vem explicada nesta Comparative Grammar of the Romance Languages (Nativlang.com, 2017), e mais sumariamente na Gramática do Português da Gulbenkian (Lisboa, 2013, volume I, p. 53-4).
No latim clássico os substantivos eram declinados—tinham a terminação modificada—segundo os casos, a que correspondiam diferentes funções sintáticas. Por exemplo a palavra rosa tinha, entre singular e plural, sete formas diferentes; e só tinha sete porque alguns casos têm formas iguais (Wiktionary):
Nominativo Genitivo Dativo Acusativo Ablativo Vocativo
Singular: rosa rosae rosae rosam rosā rosa
Plural: rosae rosārum rosīs rosās rosīs rosae
Este modelo de declinação—chamado “primeira declinação” (First Declension, Wikipedia)—é um de cinco que existiam para os substantivo no latim. Os substantivos que seguiam este modelo eram na sua maioria femininos. Na evolução do latim para quase todas as modernas línguas românicas perderam-se os casos. Nas línguas românicas ibéricas foi o acusativo que sobreviveu (rosam no singular, rosās no plural); o m final do singular perdeu-se no latim vulgar, e daí ficarmos com rosa e rosas. No italiano foi o nominativo que sobreviveu, e daí eles terem rosa no singular e rose no plural. O Wiktionary lista algumas exceções masculinas desta declinação que continuam masculinas e terminadas em -a em português: escriba, poeta, pirata. Substantivos masculinos acabados em -ma, como sistema, sintoma, clima, drama, são geralmente de origem grega.
A nossa terminação -o do masculino vem da segunda declinação (Second Declension, Wikipedia), de que é exemplo mūrus (“muro, parede”; Wiktionary):
Nominativo Genitivo Dativo Acusativo Ablativo Vocativo
Singular: mūrus mūrī mūrō mūrum mūrō mūre
Plural: mūrī mūrōrum mūrīs mūrōs mūrīs mūrī
Os substantivo que seguiam este modelo de declinação eram quase todos masculinos e neutros. No evoluir para as línguas modernas o neutro passou a masculino. Nesta declinação as terminações do acusativo eram -um no singular e -os no plural. O m final do singular perdeu-se no latim vulgar, de que resultaram as terminações -o e os do português e castelhano. No nominativo, donde vem o italiano, as terminações eram -us no singular e -ī no plural. Daí ser muros em português e castelhano, mas muri em italiano.
Portanto a princípio -am, -as e -um, -ōs eram apenas algumas das terminações possíveis da mesma palavra. Depois, segundo a Gramática do Português (p. 52), “no final da latinidade”, ao mesmo tempo que desapareceram os diferentes casos, “a alternância entre declinações passou a ser vista como um recurso sempre disponível para expressar a diferença de género”.