A jig that the upright slides into with 2 guide boards 90 degrees to the upright to run the router along. A smaller bit than the ply thickness lets you fine tune the width. Either use a guide bushing or a bearing pattern bit. If the shelves are going to be spaced equally add a stop to the jig that you can slide a piece of the Baltic into the dado.
i use 2 long thin wedges to hold the part being cut still while cutting. If you make the jig wide enough you could cut several uprights at once.
I used a jig like this in my " Maghgany Library Rolling Staircase" project journal to cut the dados for the stair treads.
A piece of ply for the base, 2 boards the same thickness as the uprights for the next layer, 2 wider boards that the router rides on at 90 degrees to the uprights. Screw everything together carefully. You might need to adjust the width of the dado and then add a screw to keep it where you adjusted it to. Make test pieces when you mill the stock for the uprights. Sand all of your Baltic and compare the pieces with a pair of calipers ( sheet thickness can vary) before you build the jig. You might try staining and finishing the uprights before you cut the dados. At the area where the bit cuts you need a piece on both sides to prevent blowouts.
Make an exact with dado jig like this. http://www.thewoodwhisperer.com/videos/exact-width-dado-jig/
Gang the legs together and cut all of the dados at once. I would make a prototype shelf unit to figure out someway to prevent racking.
If the client will agree, putting back and side pieces or diagonal bracing on just one shelf will help a lot with racking.
But if the shelves fit into the alcoves without too much clearance, then the alcoves themselves will prevent side to side racking. In that case I might make the shelves lean back very slightly against the back wall of the alcove, to prevent the shelves from racking forward.
Or, just screw the uprights into the walls. Simple and very stable.