Eccolo

codice:
for (int i = com.length - 1; i >= 0; ) {
    System.out.println(Arrays.toString(com));

    if (com[i] < 2) {
        com[i]++;
    } else {
        while (com[i] == 2) {
            com[i] = 0;
            i--;
            if (i < 0) {
                break;
            }
            if (com[i] < 2) {
                com[i]++;
                i = com.length - 1;
            }
        }
    }
}
La storia del carry è chiara ma momentaneamente non ho la testa a posto e necessito di una soluzione urgente e funzionante.
Che ne pensi? So che si può fare di meglio ma dai diversi test che ho fatto funziona a dovere.
Per quanto riguarda il "cablaggio" della dimensione dell'array della matrice mi sta bene così: tutti gli array avranno quel formato lì (sono combinazioni genotipiche, in poche parole trattasi del quadro di Punnet).