Alright, finally got this to work! Man, that was complicated.
Note: this is all using an Activity subgrid, not the Social Pane:
1. Implemented Jonas Rapp's solution to use an Activity subgrid with a special view that triggers a query modification plugin, as seen at jonasrapp.net/.../all-activities. Made sure this query modification plugin was registered on RetrieveMultiple of Activity, pre-operation.
2. Modified his solution to add an extra column with data that identifies what record this is (there are a variety of fields you can pick for this, depending on your implementation/needs). Also changed it so there's an if/then for what stage the context is in, and made the query mod code only run on stage 20 (pre-op). A great trick if you have to modify this code is to use Jonas's tool in XRMToolBox to build your fetchXML, and then generate the c# QueryExpression lines required.
3. Added a column in the view being used above, that is of the same type as the field we want to show. Text to text, etc... In this case, we were using a lookup, so it has to not only be a lookup field but one to the same entity. Sadly, there were no fields on Activity of that type, and we cannot add fields to Activity. So, had to use a field from a related entity (doesn't matter which one, since we're overwriting the display later. See next steps)
4. In the same plugin, if the context is stage 40 (post-op), run code that I based of off Aileen Gusni's blog post (missdynamicscrm.blogspot.com/.../intercept-columnfield-value-in-crm-view-retrievemultipleplugin.html) to overwrite the data being displayed. Note, this doesn't actually touch the real data - it just hijacks the display value. The tricks I ran into here were that:
a. the data I wanted isn't a column on the main result, it's a level down. So instead of using 'entity.Attributes["fieldname"]' I had to use entity.Attributes["linkentityalias.fieldname"]' to retrieve my added data from the query. And
b. since the column I was using was on a related entity, again, it was one level down. So I couldn't use entity.Attributes["fieldname"], but relatedEntity.fieldname wasn't working, etc... Had to put in a breakpoint and look at the code to realise that it wanted entity.Attributes["GUID.fieldname"]. Couldn't figure out what the GUID was for for the longest time - wasn't the entity, wasn't the relationship, wasn't the view...eventually discovered it was the alias for the link-entity in the view definition. So the way I was using linkentityalias.fieldname to reference my query, it was using the same syntax to reference the view columns. But of course it just gives it a GUID instead of an easy to read alias. I worry this might change in migration to live, so I'll keep an eye on it.
5. Register a second step on the same plugin, still for RetrieveMultiple of Activities, but this time on post-op, to run the above code.
Voila! I can now see all activities for a contact and all child contacts on the parent record, with something on each line to show which record it's actually attached to.
I really hope something more built-in happens for this in future (I mean, it doesn't seem very helpful to have all of the activities mashed together without being able to also see where they come from, but I guess everyone's use cases are different).
Hopefully this is helpful to someone else, anyway! :-)