ho dato un'occhiata al codice, e bhè come idea mi è venuta in mente di poter usare l'operazione di mod % ( resto della divisione ) per non andare fuori dai limiti della matrice! inoltre secondo me è superfluo passare tutto il vettore B alla funzione copia! io ho provato a fare una soluzione così, vedi un pò se ti potrebbe essere utile:
codice:
#include<stdio.h>

int colmax;

void copia(char A[][colmax],char car,int* i, int* j) 
{ 
    if ( (*j)%colmax == 0 && (*j)!=0 ) { 
         (*i)++;   
         (*j)=0;
    }
    A[*i][(*j)%colmax] = car;
    (*j)++;
       
}

void controlla(char A[][colmax],char B[],int M,int N,int L){
    int i,colonna,riga;
    int r=0, c=0;

//Cerca le ennuple maiuscoli  
    for(i=0;i<L;i++){
        if(B[i]>='A' && B[i]<='Z'){
            copia(A,B[i],&r,&c);
        }
    }

//Cerca le ennuple minuscoli
    for(i=0;i<L;i++){
        if(B[i]>='a' && B[i]<='z'){
            copia(A,B[i],&r,&c);
        }
    }

//Stampa matrice A
    for(riga=0;riga<M;riga++){
        for(colonna=0;colonna<N;colonna++){
            printf("%c",A[riga][colonna]);
        }
        printf("\n");
    }

}

int main(){
    int M=5,N=3,L=M*N;
    char B[]="casMARSONpalESA";
    char A[M][N];

    printf ("%s\n", B);
    colmax=N;
    controlla(A,B,M,N,L);
    printf("\n\n");
    system("pause");
    return 0;
}