I agree. If you go into this trying to do everything the SQL Server way you'll just frustrate yourself.
Code:
CREATE OR REPLACE FUNCTION get_customer(INT default NULL)
RETURNS SETOF customer AS
$$
SELECT * FROM customer WHERE customer_id = COALESCE($1, customer_id);
$$
LANGUAGE SQL;
Now as you noticed, if you just call the function in the column list you'll get comma separated text back. But it really is a record type. To access it as such try one of these approaches.
Code:
SELECT (get_customer()).*;
SELECT * FROM get_customer(100);
SELECT c.customer_id, c.store_id, c.first_name
FROM get_customer(100) c;