faccio solo una precisazione:
un DataSet è un "contenitore" di DataTable (permettetemi il termine).

In questo caso funziona poiché il DataSet viene creato con una sola DataTable, di conseguenza l'assegnazione alla proprietà datasource prende la prima (e unica) tabella presente:
codice:
rpt.DataSource = ds;
viceversa se il DataSet fosse più complesso.

Se la tua funzione restituisce una sola tabella e non necessita di altro (ovvero viene usata solo in questo contesto o simile), fai che restituire direttamente un DataTable alla funzione.