Das liegt daran, dass die Iteration über die selektierten Rows allein die Position des Datensatzzeigers im DataSet nicht ändert. Du stehst also quasi die ganze Zeit auf dem selben Satz, nämlich den durch Anklicken zuletzt markierten.
Du musst innerhalb der Schleife den Datensatzzeiger positionieren:
Delphi-Quellcode:
for i := 0 to DBGrid1.SelectedRows.Count-1 do
begin
DBGrid1.DataSource.DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
.
.
end;