You may find that First() and Last() do not do exactly what you want if you only have GROUP BY. For First() and Last() to provide "commonly expected" behavior, you need an ORDER BY as part of the mix. This is because in the absence of an ORDER BY clause, you cannot predict which record would be First() or Last() for any data set. The underlying table is an unordered set of records. Grouping only changes this problem slightly by breaking down the underlying table into groups - but within each group, there is still no guaranteed order without that ORDER BY.
The reason reports can be so vexing is that they want to impose specific order on your input recordset no matter WHAT its source (tables, queries, multi-layered queries.... all the same to the report), so they "deconvolute" it and "adjust" the data stream to match the grouping and sorting options you specified to the report builder. In other words, they override the actual .Recordsource order - which is why MajP said that property wasn't available. The report isn't necessarily using it as it was originally written and it doesn't show you what it IS using.
Your problem is that you appear to want both the detail sections AND the concatenated data in headers or footers. Reports give you headers and footers, and you can write VBA to build a string based on code in the Group Header, Group Footer, and Detail Format events. Presenting that concatenation in the appropriate Footer is easy enough. Putting it in the header requires you to be prescient. But of course, Access doesn't come with a built-in crystal ball.
Doing this formatting in a query faces the OTHER problem - that you can't so easily put headers and footers in the datasheet view of a query. There is also no place for code to run unless you create a public function to be called in a query, but there is also no way to put it anywhere different from the other detail records.
Thus, you are trying to get the best of both worlds but asking for something that exists in neither. The saving grace is that with VBA, you can add some event code to get very close to where you want to go.