TLJH with NativeAuthenticator does need to create system users. If you can’t create user accounts, then you probably want to use DockerSpawner to put users in containers. For this, you don’t need to create any system accounts, and the username requirements are a little more lax (though using safe linux usernames is still a good idea for simplicity).
If you install dockerspawner:
pip install dockerspawner
and set:
c.JupyterHub.spawner_class = 'docker'
then DockerSpawner will be used, and you can pick the image, mounts, etc. in DockerSpawner.