Ele está fazendo isso pois você está sempre pegando a primeira linha do DataGrid(dgvConsultCte.Rows[0]).
Tu pode fazer da seguinte maneira, assina o evento de CellClick do datagrid e em vez de usar 0 como index, usa o index da linha clicada.
Exemplo:
private void dvgConsulta_CellClick(object sender, DataGridViewCellEventArgs e)
{
var indexDaLinhaClicada = e.RowIndex;
txtCodigoCfop.Text = dgvConsultaCte.Rows[indexDaLinhaClicada].Cells[1].Value.ToString();
txtCfop.Text = dgvConsultaCte.Rows[indexDaLinhaClicada].Cells[3].Value.ToString();
txtDescricaoCfop.Text = dgvConsultaCte.Rows[indexDaLinhaClicada].Cells[2].Value.ToString();
}
Abraço!