Anche secondo me la struttura non ha nulla che non va, ovviamente in base alle informazioni fornite.

Quello che farei è trasformare il membro di istanza Categoria per la classe Prodotto in un campo privato, invece che pubblico, esponendo il suo valore con una proprietà "read only", di sola lettura. Così come è fatta, chiunque potrebbe modificare l'oggetto Categoria a cui punta il membro nella classe Prodotto, dato che è pubblico; invece, ciò che vorrai - suppongo - è consentire modifiche alle sole proprietà di tale oggetto, correttamente istanziato nel costruttore.

Si tratta comunque di rifiniture: se la classe la usi tu, non penso incontrerai problemi, ma puoi sempre aumentare le garanzie in proposito.

Ciao!