Io ho creato una soluzione basata su un "controllo utente" dove basta impostare la colonna e i tasti accettati dalle rispettive celle tramite le "proprietà" del controllo, esempio:
codice:
Public Class dgv_modificato
    Inherits System.Windows.Forms.DataGridView
    Dim colonna As Integer
    Dim lista_tasti As New List(Of Keys)
    Dim colonna_controllata As Integer
    Sub New()
        'tasti da 0 a 9
        lista_tasti.Add(Keys.D0)
        'eccetera
        'tasti del tastierino da 0 a 9
        lista_tasti.Add(Keys.NumPad0)
        'eccetera
        'varie
        lista_tasti.Add(Keys.Delete)    'CANC
        lista_tasti.Add(Keys.Back)      'DELETE
        lista_tasti.Add(Keys.Oemcomma)  'VIRGOLA (188)
        lista_tasti.Add(Keys.OemPeriod) 'PUNTO (190)
        lista_tasti.Add(Keys.Decimal)   'PUNTO TASTIERINO(110)
        lista_tasti.Add(Keys.Left)      'FRECCIA SINISTRA
        lista_tasti.Add(Keys.Right)     'FRECCIA DESTRA
        lista_tasti.Add(131139)         'CONTROL C (COPIA)
        lista_tasti.Add(131158)         'CONTROL V (INCOLLA)
        lista_tasti.Add(131162)         'CONTROL Z (TAGLIA)
    End Sub
    'da impostare nel form
    'è il numero di colonna sulla quale effettuare
    'il controllo
    Public Property ColonnaControllata As Integer
        Get
            Return colonna_controllata
        End Get
        Set(value As Integer)
            colonna_controllata = value
        End Set
    End Property
    'in "Sub New" vengono preimpostati una serie di tasti
    Public Property ListaTasti As List(Of Keys)
        Get
            Return lista_tasti
        End Get
        Set(value As List(Of Keys))
            lista_tasti = value
        End Set
    End Property
    Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
        '*************************************************************************
        'DA COMMENTARE IN RELEASE
        'questo:
        Console.WriteLine(keyData & " " & keyData.ToString)
        'in fase di debug scrive nell'output le informazioni sul tasto premuto,
        'serve per identificare il valore "keydata" da inserire nella lista.
        '*************************************************************************
        If colonna_controllata = colonna Then
            If lista_tasti.Contains(keyData) = False Then
                msg = Nothing
            End If
        End If
        Return MyBase.ProcessCmdKey(msg, keyData)
    End Function
    'al doppio clic su una cella riporta la colonna
    Private Sub ME_CellBeginEdit(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs) Handles Me.CellBeginEdit
        colonna = e.ColumnIndex
    End Sub
End Class
Vedete voi se può esservi utile...
ciao