Что сказал KAJ. Но есть вероятность перепутать результаты ping-запросов, потому что они не связаны с ip-адресами в сетке. Невозможно сказать, какой хост ответит первым, и если пинг> 5 мс, может произойти все что угодно, потому что между обратными вызовами меняется текущая строка. Что вам нужно сделать, это отправить ссылку на datagridviewrow для обратного вызова. Для этого используйте перегрузку SendAsync:
ping.SendAsync(ip, 1000, row);
И в обратном вызове:
DataGridViewRow row = e.UserState as DataGridViewRow;
Возможно, вы также захотите проверить ответ. Статус, чтобы убедиться, что время запроса не истекло.