Tad,
I was working on a very similar problem and ran into two brick walls.
User-defined functions don't allow dynamic T-SQL to be executed within the function. This prevents passing a SQL statement to the function as a parameter and executing it internally.
My work-around idea for that was to pass the completed recordset to the function as an argument, and just have the function convert it to a delimited list. Unfortunately, SQL 2000 and 2005 don't accept table datatypes as function input parameters.
However, SQL 2008 will accept a table datatype, so you can probably design a function to accept a general recordset as a parameter and flip it to a delimited list.
My interim result was similar to yours above, just have a function for each query you need to flip and pass it the key value. The performance is acceptable, and much better than having the destination application parse a cartesian product out of the recordset.