Proxmox VM folders don’t exist, but pools and tags cover what you need. Pools group VMs for permissions and organization, tags add labels across pools. Here’s how to set both up.

Pools: Grouping and Permission Scoping
Pools are the closest thing to folders. You create a pool, assign VMs to it, and then grant users access to that pool. The UI shows a pool view under Datacenter → Permissions → Pools, but you can also do it from the CLI.
pvesh create /pools --poolid dev-vms
pvesh set /pools/dev-vms -vms 100,101,102
That creates a pool called dev-vms and adds VMs 100, 101, and 102 to it. To give a user access to just that pool, you set an ACL:
pvesh set /access/acl --path /pool/dev-vms --roles PVEVMUser --users bob@pve
Now bob can only see and manage VMs in that pool. Permissions are inherited by the VMs in the pool. That’s the real power of pools — not just visual grouping, but scoping who can touch what.

Tags: Labels That Cut Across Pools
Tags are simpler. They’re just labels you stick on a VM. A VM can have multiple tags, and tags don’t affect permissions. Use them for things like “production”, “test”, “database”, or whatever makes sense. In the UI, you add tags in the VM’s summary page. From the CLI:
qm set 100 --tags production,web
Then you can filter the VM list by tag in the UI. That’s it. No folders, but pools and tags get you most of the way there.
What I’d Do
Use pools for anything that needs different permissions — like a dev pool and a prod pool. Use tags for quick filtering when permissions don’t matter. Don’t try to force a folder hierarchy; Proxmox’s flat model works fine once you stop fighting it. If you need more structure, look at the API to script your own grouping logic.