So I figured out a nice compromise. I started with the git code as described here:
http://www.shocksolution.com/microfluidics-and-biotechnology/visualization/python-vtk-paraview/
It's only one python file. The gist is the code there lets you give x,y,z positions and radius for points and outputs an XML file that is in VTK format. So to do the particles I just hand it the x,y,z positions and then a constant for the radius for all particles. Then I just make a spherical glyph on the datasets.
For the boxes I use the exact same code. For each box I still output x,y,z coordinates where the x,y,z values are the coordinates of the center of the box. Then for the "radius" parameter I use the edge length of the cube. This works because again in paraview I just glyph the datapoints for the boxes. I use the box glyph, and scale by scalar where the scalar is the radius. If you don't orient the box glyphs and set the scalar factor to 1 you get the desired result. Here's a simple example with everything uniform:

So I just output the coordinates in my C datastructure to CSV files and then in python pull in the files and use the code at the link and open the result with paraview. Here's how I used the code at the link:
from vtktools import VTK_XML_Serial_Unstructured
import sys
if len(sys.argv) > 2:
treeFile = sys.argv[1]
bodyFile = sys.argv[2]
else:
print 'No input files'
exit(4)
x = []
y = []
z = []
r = []
f = open(treeFile, 'r')
for line in f:
v = line.split(',')
x.append(float(v[0].strip()))
y.append(float(v[1].strip()))
z.append(float(v[2].strip()))
r.append(float(v[3].strip()))
f.close()
temp = treeFile.split('/')
if (len(temp) == 1):
temp = temp[0]
else:
temp = temp[-1]
tree_writer = VTK_XML_Serial_Unstructured()
tree_writer.snapshot(temp.split('.',1)[0] + '.vtu', x, y, z, [], [], [], [], [], [], r)
tree_writer.writePVD("octree.pvd")
x = []
y = []
z = []
r = []
f = open(bodyFile, 'r')
for line in f:
v = line.split(',')
x.append(float(v[0].strip()))
y.append(float(v[1].strip()))
z.append(float(v[2].strip()))
r.append(float(v[3].strip()))
f.close()
temp = bodyFile.split('/')
if (len(temp) == 1):
temp = temp[0]
else:
temp = temp[-1]
body_writer = VTK_XML_Serial_Unstructured()
body_writer.snapshot(temp.split('.',1)[0] + '.vtu', x, y, z, [], [], [], [], [], [], r)
body_writer.writePVD("distribution.pvd")