I use 30 man rosters (usually 18 batters / 12 pitchers) and for expansion (this will depend on how many teams you have), I have each expansion team choose 3 batters and 2 pitchers from the rookie / free agent pool.  I allow each existing team to protect 3 batters and 2 pitchers originally and then after every pick (or every couple of picks if you're going from 20 to 24) each team gets to protect another 3 and 2.  Plus I would put a limit on the number of players a team can lose.  I then fill up the lost spots from the remaining free agents / rookies.