With the shunts, you don't want to do cell balancing, per se. That would simply drag down the level of the stronger cells to that of the weakest. It has been my experience, with a123 cells at least, that eventually all the cells will end up at different levels. Paralleling them will help normalize the differences, but you will still end up having some difference between parallel bolcks that are in series. The bottomline is, it doesn't matter. What you want to do to get the maximum life out of the cells is simply to make sure each cell/block of cells can a 100% charge, and you want to make sure that each cell/block can't be over-discharged. A 100% charge for one might be different than a 100% charge for another, and it might take one cell longer to get to that point than another. The best way to ensure that each cell/block can get a "full" charge, is to use an individual CC/CV charger on each cell. This would let each cell get a constant max current while the voltage rises. Because it becomes harder and harder for a cell to accept current as it gets fuller, the voltage will rise. Once the cell gets to about 3.65V, the charger holds it there. With the voltage held there, the cell can't accept as much current so the current starts to drop. When the current drops to about 100-200 mA, the cell is about as full as it can get.
A bulk CC/CV charger would work fine if all the cells had exactly the same capacities, internal resistances and thermal characteristics, but they don't. What happens is that as a cell charges, the voltage will rise at a steady rate. Once it gets above about 3.65V-3.70V, however, the rate the voltage rises goes up significantly. It can hit 4.0V in a matter of seconds. If you have a few stronger cells that reach this point first, it will cause the charger to hit the CV limit.
these stronger cells will then start reducing the current they take in. Since all the current has to go through all the cells, all the time, the weaker/slower cells can't ever get to their own "full" levels. If you then try and balance the cells, the stronger ones are bleed off and dragged down to the level of the lowest one. This is exactly how the cheap Chinese BMS boards that come with the so-called "duct tape" packs work.
What the shunts do is give us the best of both worlds. Each cell can get a full charge, at its own pace, but a bulk charger/supply can be used. What happens is that the voltage for each cell is "clamped" at around 3.65V, which will cause it to start reducing the current it will accept. Whatever it doesn't "use", will be conducted through the shunt. The net result is that the next cell in series will have the full amount of current available. So in effect what you get is a single bulk CC supply with individual CV control.
In any case, if you don't use a shunt regulator chip, like the LM431, which is really nothing more than a programmable zener diode, the program would need to peroform this function for each channel, and then drive the opto/darlington combo for each. That means you need a separate line that needs to go to each channel, just to control the shunt, You also need separate lines for whatever is used to sense the voltage (diff amp, divider network, etc...). Running traces for all these takes up lots of real estate and I'm not sure it gets you all that much. The LM431 is about $0.11 at Mouser (512-FAN431LZXA). I'm a big fan of distributed processing, and I think that unless you are going to save big chunks of money, it may not make sense to have the micro do everything.
-- Gary