Из изврата. Сделайте текст одного из заголовков подлинее, чтобы заголовок DataGridView был повыше (или принудительно установите высоту заголовка), а потом поверх наложите TextBox, у которого есть событие изменения содержимого.

Вот простой пример (.NET 7/C# 11):
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace WinFormsApp2;
public class Form1 : Form, INotifyPropertyChanged {
IContainer components = null;
DataGridView dataGridView1;
TextBox textBox1, textBox3;
BindingList<Person> _persons;
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) { components.Dispose(); }
base.Dispose(disposing);
}
public BindingList<Person> Persons { get => _persons; set { _persons = value; OnPropertyChanged(); } }
public Form1() {
SuspendLayout();
Controls.Add(textBox1 = new TextBox() { Location = new Point(163, 50), Name = nameof(textBox1), Size = new Size(100, 23) } );
textBox1.TextChanged += textBox1_TextChanged;
Controls.Add(textBox3 = new TextBox() { Location = new Point(63, 50), Name = nameof(textBox3), Size = new Size(100, 23) });
textBox3.TextChanged += textBox3_TextChanged;
Controls.Add(dataGridView1 = new DataGridView() { Location = new Point(22, 19), Name = nameof(dataGridView1),
Size = new Size(260, 180), ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize });
dataGridView1.RowTemplate.Height = 25;
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(310, 224); Name = Text = nameof(Form1);
ResumeLayout(false); PerformLayout();
dataGridView1.DataBindings.Add("DataSource", this, nameof(Persons));
}
protected override void OnLoad(EventArgs e) {
Persons = new BindingList<Person>() { new Person { Name = "Иван", SurName = "Петров" }
, new Person { Name = "Алексей", SurName = "Сидоров" }
, new Person { Name = "Сергей", SurName = "Зудин" }
, new Person { Name = "Андрей", SurName = "Вдовин" }
, new Person { Name = "Пётр", SurName = "Красин" }
, new Person { Name = "Дормидонт", SurName = "Семинарский" } };
}
public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
void textBox3_TextChanged(object? sender, EventArgs e) {
var s = textBox3.Text.ToLower(); if (String.IsNullOrWhiteSpace(s)) return;
var x = Persons.FirstOrDefault(f => f.Name.ToLower().StartsWith(s));
if (x != null) dataGridView1.CurrentCell = dataGridView1.Rows[Persons.IndexOf(x)].Cells[0];
}
void textBox1_TextChanged(object? sender, EventArgs e) {
var s = textBox1.Text.ToLower(); if (String.IsNullOrWhiteSpace(s)) return;
var x = Persons.FirstOrDefault(f => f.SurName.ToLower().StartsWith(s));
if (x != null) dataGridView1.CurrentCell = dataGridView1.Rows[Persons.IndexOf(x)].Cells[1];
}
}
public class Person : INotifyPropertyChanged {
string _name, _surName;
[DisplayName("Имя ________ ________")]
public string Name { get => _name; set { _name = value; OnPropertyChanged(); } }
[DisplayName("Фамилия ________ ________")]
public string SurName { get => _surName; set { _surName = value; OnPropertyChanged(); } }
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
internal static class Program {
[STAThread]
static void Main() { ApplicationConfiguration.Initialize(); Application.Run(new Form1()); }
}