Thanks for the kind words about the library.
Yes, at the moment the main approach to new types of lattice Hilbert spaces is to make a SiteSet by hand. However, despite a lot of "boilerplate", the SiteSet definition files are actually rather simple and shouldn't be too hard to customize (plus I can help).
If you take a look at the SiteSets which come with ITensor, you'll see that one mainly needs to define a constructor which makes a set of IQIndex objects then also define a few methods of the form getXYZ such as getOp, getSi, and getState. The first returns operators; the second individual site indices; the last returns "IndexVals" which represent an index set to a particular value. Most of the other methods are optional and are needed e.g. if you want to write your SiteSet to disk.
One key question is: what sort of bosons live on the C sites? Are they "hard core" bosons or is their occupation number unbounded? Both are fine, but for regular "soft" bosons you will need to restrict the Hilbert space to a maximum occupancy number. (There are other fancier tricks to handle large numbers of bosons but they are rather specialized.)
That's a really nice idea about viewing SiteSets as being made of more granular objects just representing a single site of a particular type. Then it would trivial to make a S=1 chain, but with S=1/2 sites on one or both ends for example. We plan to improve the SiteSet system in the near future and will strongly consider this suggestion.