There are several ways you can wrap an existing shape; you can use IShapeTableProvider, IShapeFactoryEvents, ContentHandler (for parts).
CoreShapes is just an IShapeTableProvider and you can just implement your own to add your own customizations to any existing shapes or even create your own. There isn't a Handler for a list because it's not a part. IShapeFactoryEvents and IShapeTableProvider
boil down to pretty much the same thing, it's just that IShapeFactoryEvents will be run for every single shape that gets created; so you don't really want to do that unless you've got a really good reason - for instance, the Shape Tracing module uses it to
build the shape data for everything (which is how I found out how to do it). So it doesn't matter where the shape is being created, it will always get passed through the shape building pipeline. I haven't really seen any documentation about this, I literally
worked most of it out by studying Orchard's code (and earning a headache in the process! It gets pretty complex in there...)
So the exact way you'd do it in IShapeTableProvider is:
// Here's the tricky bit. I don't know where you want to get your title from.
// The list will only contain child items. But it might be possible to access the parent of the first item. Depends what you need.
displaying.Shape.Title = "Here's a title";
Then you just need a ListWrapper.cshtml like this:
This is basically how shape tracing wraps its shape data divs around stuff.
However since what you're trying to do is in Containers, and especially as you've got your own ItemController, the thread I've linked to above shows you how to pass the ContentItem down into the display shape anyway. So you possibly
don't need the wrapper, but it's useful to know anyway.
Creating a sub shape is easy as long as you've got access to a shape factory (which is usually a dynamic object; in a Driver you get one passed in as a parameter, but in a lot of the shape event contexts it's a property called New). For instance in the OnCreated
event you could call created.New.SomeShape(Foo:"Bar") - and that will render a SomeShape.cshtml will a model property of Foo (but of course other shape events can also modify that, add alternate template names, add wrappers, anything, before it gets to rendering