Beh, io faccio sempre riferimento al mio modo di lavorare. Non so cosa avvenga in C#...può darsi che la definizione di classi astratte sia una pratica conveniente in quel linguaggio.

Per quanto riguarda la definizione che hai dato di polimorfismo, credo che sia fondamentalmente corretta. Il polimorfismo si esprime sia attraverso l'esecuzione del metodo appropriato in base alla classe con cui si ha a che fare, sia alla possibilità di implementare tramite codice quel meccanismo.

Ovviamente, la definizione che ne dò io viene formulata in base all'approccio pratico che applico nella scrittura del codice...magari qualche autorevole guida sulla programmazione ad oggetti ne dà una definizione formale diversa.

Ciao!