¿Cómo puedo pasar de una celda a otra en una vista de datos de datos programáticamente?

Necesito permitir que solo se ingrese un carácter en las celdas editables de datagridview (todas las demás columnas, las impares, son editables); si el usuario agrega un segundo carácter mientras está en una de estas celdas, el cursor debe moverse a la siguiente celda hacia abajo y colocar ese segundo valor allí (al presionar nuevamente esa tecla se mueve hacia abajo nuevamente, y así sucesivamente). Si está en la parte inferior de la cuadrícula (la fila 12), debería moverse a la fila 0 y también mover dos columnas a la derecha.

Intenté hacer esto:

private void dataGridViewPlatypus_KeyDown(object sender, KeyEventArgs e) {
    var currentCell = dataGridViewPlatypus.CurrentCell;
    int currentCol = currentCell.ColumnIndex;
    int currentRow = currentCell.RowIndex;
    if (currentCell.Value.ToString().Length > 0) {
        if (currentRow < 11) {
            dataGridViewPlatypus.CurrentCell.RowIndex = currentRow+1;
        } else if (currentRow == 11) {
            currentCell.RowIndex = 0;
            currentCell.ColumnIndex = currentCell.ColumnIndex + 2;
            dataGridViewPlatypus.CurrentCell = currentCell;
        }
    }
}

... pero obtengo mensajes de error a los que RowIndex y ColumnIndex no se pueden asignar, ya que son de solo lectura.

Entonces, ¿cómo puedo lograr esto?

Advertencia: sé que también tendré que agregar lógica para mover a la columna 1 si actualmente se encuentra en la parte inferior de la última columna editable.

ACTUALIZAR

Por la respuesta de Tergiver, esto es lo que tengo hasta ahora, pero no sé cómo avanzar a la siguiente celda.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (this.ActiveControl == dataGridViewPlatypus)
    {
        var currentCell = dataGridViewPlatypus.CurrentCell;
        if (currentCell.Value.ToString().Length == 1) 
        {
            ;//Now what?
        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
ACTUALIZACIÓN 2

Gracias a todos; esto es lo que estoy usando para que funcione bastante (aún quiero poder permitir que el usuario simplemente mantenga presionada la tecla y que ese valor se ingrese continuamente en las siguientes celdas):

private void dataGridViewPlatypus_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) {
    int columnIndex = (((DataGridView)(sender)).CurrentCell.ColumnIndex);
    if (columnIndex % 2 == 1) {
        e.Control.KeyDown -= TextboxNumeric_KeyDown;
        e.Control.KeyDown += TextboxNumeric_KeyDown;
        e.Control.KeyUp -= TextboxNumeric_KeyUp;
        e.Control.KeyUp += TextboxNumeric_KeyUp;
    }
}

private void TextboxNumeric_KeyDown(object sender, KeyEventArgs e) {
    var tb = sender as TextBox;
    if (tb != null) {
        tb.MaxLength = 1;
    }
}

// TODO: Now need to find a way to be able to just press down once
private void TextboxNumeric_KeyUp(object sender, KeyEventArgs e) {
    var tb = sender as TextBox;
    if (tb != null && tb.TextLength >= 1) {
        if (dataGridViewPlatypus.CurrentCell.RowIndex != dataGridViewPlatypus.Rows.Count - 1) {
            dataGridViewPlatypus.CurrentCell = dataGridViewPlatypus[
                dataGridViewPlatypus.CurrentCell.ColumnIndex,
                dataGridViewPlatypus.CurrentCell.RowIndex + 1];
        } else { // on last row
            this.dataGridViewPlatypus.CurrentCell = this.dataGridViewPlatypus.CurrentCell.ColumnIndex !=    dataGridViewPlatypus.Columns.Count - 1 ? this.dataGridViewPlatypus[this.dataGridViewPlatypus.CurrentCell.ColumnIndex    + 2, 0] : this.dataGridViewPlatypus[1, 0];
        }
    }
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta