Can you perhaps adapt this
v=Select[Tuples[{0,1},16],
Total[Take[#,{1,4}]]==1&&Total[Take[#,{5,8}]]==1&&
Total[Take[#,{9,12}]]==1&&Total[Take[#,{13,16}]]==1&&
#[[1]]+#[[5]]+#[[9]]+#[[13]]==1&&#[[2]]+#[[6]]+#[[10]]+#[[14]]==1&&
#[[3]]+#[[7]]+#[[11]]+#[[15]]==1&&#[[4]]+#[[8]]+#[[12]]+#[[16]]==1&];
r=Map[MapThread[Rule,{{z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10,z11,z12,z13,z14,z15},#}]&,v]
which finds the 24 acceptable assignments.
And then this
{P00,P11,P22,P33} = {z0 P0+z1 P1+z2 P2+z3 P3,z4 P0+z5 P1+z6 P2+z7 P3,
z8 P0+z9 P1+z10 P2+z11 P3,z12 P0+z13 P1+z14 P2+z15 P3}/.r[[1]]
{D00,D11,D22,D33} = {z0 D0+z1 D1+z2 D2+z3 D3,z4 D0+z5 D1+z6 D2+z7 D3,
z8 D0+z9 D1+z10 D2+z11 D3,z12 D0+z13 D1+z14 D2+z15 D3}/.r[[1]]
uses the first such assignment to find the first set of your eight expressions