There are methods to create and remove virtual desktops via dbus, but I think it would be convenient to provide these methods for KWin scripts as well.
It's not zero-based because of the goddamn X11...
In order to match what input values VirtualDesktopManager::createVirtualDesktop() expects, I think it's better to keep the position in range [0, count]. We could make client.desktop zero-based in plasma 6.
It's also worth to point out that the client.desktop property is deprecated since a window can be on more than just one virtual desktop.