Assumption 1) The distinction between 'smooth' and 'square' sections will be based on display / in-game material type.
Assumption 2) The use of binary density is due to not actually storing density, rather storing (in some possibly compressed fashion) the identity or type of matter at each point.
Assumption 3) The mesh does not need to be manifold. (self-crossing is allowed, although holes shouldn't be).
Result: Separate mesh passes for each material. If the material is 'smooth-type', run marching cubes on it. If the material is 'blocky'-type, place some of the six quads around each point.
To maintain "solidity" (continuity of surface, without holes), the smooth pass must consider any solid an occupied space, while the block pass should ignore only cases where the face is a block (or continuously smooth material, but that requires an extra 8 points fed in to the check, which may be worse than carting about a pile of waste interior faces). To avoid duplication, the smoothed surface is only drawn if at least one of the 8 points is 'smooth-type', while the block pass draws if the center point is 'block-type'.
As far as I can tell, the problem of 3^8 arises from having a single pass with values on the corners. By adding a second pass (with points on the sides and center), only 2^6 + 1 cases need to be computed beyond the 2^8 already present in a marching cubes pass.