Oh, I see the difference now.
On a new file (with Blender defaults) bpy.data.collections.new("MyTestCollection") creates an empty collection whereas bpy.ops.collection.create("MyTestCollection") creates a collection that contains the default cube. This is in line with your explanation because when opening a new file, the cube is active/selected.