Some techniques to get more information.
Write down what you know about the network settings on each device, draw a diagram of how things connect. As you check things and run tests consider whether this information needs adding to or if any of it is wrong.
With two DHCP servers on one subnet how do you know that all the devices will get the settings you expect? For example, if the allocation is by MAC address, check the the DHCP server settings carefully and check that PC0 and PC1 consistently get the details you planned for.
To distinguish between a DNS and a routing problem, try pinging between PC0 and PC1 and between each of these and each of the DNS servers and routers by IP address using ping -n , or its equivalent in your OS. [ping -n tells ping not to look up the names of hosts when displaying its output, by using this and pinging to an IP address we can avoid the need for DNS in this test]. Some of the responses may not happen: this could be security features on the device or security constraints working correctly or a problem: write down what you tested and what the result was and then think about it.
Check the setup of PC0 and PC1 including which nameserver(s) should they use (these must be specified as IP addresses, not as names) and domain names (if the two subnets have different domain names then these need to be specified explicitly or be in the domain search list in the client DNS setup). Check that there are no settings in the hosts files on the PCs that could clash with names that should be resolved using DNS. Try pinging between devices by name: even if the ping fails it will report whether it could resolve the name to an IP address. Use dig or nslookup to query the two DNS servers to see whether they can both respond with resolutions for the names of PC0 and PC1. These queries should be done to both nameservers from devices on both subnets (for example dig @ will attempt to use to resolve ).
Check the routing tables of PC0, PC1, the two DNS servers and the two routers. See if all have routes to the 172.16.2.x and 172.16.1.x subnets. I assume, but you should check, that these are all /24 networks (subnet mask 255.255.255.0) but you need to check that all the devices have the same subnet mask setting and that this is reflected in the routing tables.
traceroute between PC0 and PC1 (both ways) will confirm that traffic is taking the route you would expect.
Somewhere in here I would personally be using a sniffer. You might not be able to interpret the output from that yet and, hopefully, some of these simpler checks and tests will be helpful.
This should all contribute to a clearer picture of what does work, what doesn't work, whether these states are stable (i.e. it either works or doesn't rather than works sometimes) and, probably, why.