The issue was the nodejs and solution containers had scale set to 0 by default which excludes them from the running environment. CM depends on the solution container and the rendering container depends on the nodejs container. Since those weren't running the CM and rendering containers never attempt to start preventing other containers from running. Deleting ...
Turns out this is a known bug in Docker Windows.
I can run the rendering host on the Docker host (from Visual Studio or dotnet CLI) as an alternative, then restart the rendering container to test Experience Editor
Thanks to Nick Wesselman for pointing me in the right direction.