>Effectively, a composite type that can represent a row in a class
That may be true, but users expect to see "user defined types", not tables and views. As such, the query driving the display should be something like:
WITH types AS ( SELECT reltype FROM pg_class WHERE relkind = 'c' ) SELECT * FROM pg_type WHERE oid in (SELECT reltype FROM types) ORDER BY typname;
No need to duplicate everything else.
No - if you switch on "Show system objects", it will display system objects such as row types. That's the whole point of the switch (which is off by default).