Sort at rendering time if you sort at all. You don't need to keep the list sorted during every operation; in fact, this may be harmful. What happens if you spawn 20 enemies at once? Sort 20 times? They sorted quality doesn't matter until rendering, so why ever do it more than once per frame?
Furthermore, with an entity-component system, it can be handy to keep component databases sorted similarly. Despite all the theoretical cruft on the Internet about ECS, you will at times need to update two object lists in parallel or otherwise break out of the single-system ideal. Keeping the entities' components in these lists consistently ordered will make such updates faster; instead of iterating over one list sequentially and the other in essentially random order, you iterate over both sequentially. Your component databases should intrinsically have this property.
There's also a strong argument to make for separate object collections. The ComponentSprite component can just be a data record noting what the object wants rendered while a completely separate scene graph manages SceneSprite objects that deal with efficient rendering. Complex game objects might be made out of multiple sprites or so on in ways that are inefficient to handle with game object hierarchies. Your renderer and object systems don't need to be interdependent. Or they can be. Whichever is easier for your game.
When the renderable list changes, just mark a flag that it's dirty. Before rendering, check the flag and resort if it's set (and then unset the flag, of course).
In 3D systems this is more important as the entire sort order is likely to shift and change almost every frame.
Remember that it's not just layer you might want to sort by. With enough objects on screen - even in 2D - you might need to sort by screen tile, sprite, effect, etc., in addition to or instead of layer/depth.
For many games you can split your renderable object list into a set of layer "buckets." When an object is create/removed/re-layered, just perform a simple add/remove as necessary to the corresponding bucket(s). No need for explicit sorting steps at all. Many 2D games work with only a few pre-defined layers so they're simply no need for arbitrary depth/layer values to sort by.