A priori tu as saute une etape :

da.Fill(ds.Tables[0]); // Tu charges directement ds.Tables[0] qui n'existe pas
dtgv.DataSource = ds; // Tu passes tout le dataset en tant que data source...