The way I find visible outlines in CSG calculations is as follows:
Each edge occurs between two faces, right? And each face has a normal. A normal either faces towards or away from the camera (or perpindicular to, but we'll call that "away"). For each edge, if one face's normal points towards the camera and one points away from the camera, that edge is a visible outline edge.
For arbitrary geometry, this will require some more detailed data structures than just a vertex and indice array, but for cubes you can probably figure out something simpler.