En todo caso, yo devolvería el DataSet en lugar del DataSource y así sólo tienes que preocuparte por la destrucción de un objeto.
De todas formas, habría que entender qué es eso de "algo más OOP". ¿A qué te refieres? Toda la VCL de delphi es OOP. Un DataSet, un DataSource, un DBEdit, un DBGrid, todos ellos son objetos.
Si ya has trabajado con la triada mencionada, ¿qué ganas proveyendo los mismos objetos, como un DataSet, mediante un método? ¿Dónde está la independencia de la capa de datos si métodos como Leer reciben un componente tan específico como un TADOConnection?
Quizá, y recalco el quizá, una idea sencilla como
ésta de Wayne Niddery, te pueda dar un punto de partida parra algo no tan complicado.
// Saludos