So I think the easiest approach would be to use an unmanaged bridge inside the virtualbox that is running your LXD service which connects to the VMs external interface that is in turn connected to your actual home network.
The issue you’ll face is that virtualbox by default prevents multiple MACs on a VMs NIC, so you need to ensure that the VM has that option enabled. See https://www.nakivo.com/blog/virtualbox-network-setting-guide/ and promiscuous mode on the bridge adapter.
Once you’ve done that you can then setup an unmanaged bridge called br0 connected to your VMs network interface in the Ubuntu VM, using, for example, netplan:
Then you can create your instances with NICs that connect to that bridge (either by adding NIC devices to the instance or setting up a profile with it):
lxc init images:ubuntu/focal c1
lxc config device add c1 eth0 parent=br0
lxc start c1
This will then connect your instance to your internal network, and it will perform DHCP just like any other device on your network. You can optionally go into the instance and modify its config to assign static IPs if you like, or modify your network’s DHCP server to assign a static IP to the instance’s MAC address.
Now you need to resolve (excuse the pun) the DNS issue. For this you can use any existing DNS server you use to add entries for your LXD instances, or you can setup a separate instance that runs a DNS server as you suggested earlier.
As for the VPN, I’m still not sure how that somes into it, do you mean a network level VPN on your router/gateway, or a service running on your PC?