At a certain block height (when block's are getting full), addresses with coin are divided up between new chains--a chain split. The miners (and full nodes) also divide up between chains. At this point, addresses on chain 1 can only send to chain 1 however any address created will work on any chain. So now when you spend coin on chain 2, it will be received by an address on chain 2. Any new address created, however, can receive coins on any chain but, once again only spend on the chain it received on.
Example:
If there were 8 cardinal chains, address E1UG2nBnxbKoBuvZt1NQqxkRiZR35gfsJS could exist on all chains but this would be a separate identity for each one. Another address on chain 2 could send 5 coins to E1UG2nBnxbKoBuvZt1NQqxkRiZR35gfsJS and the balance for E1UG2nBnxbKoBuvZt1NQqxkRiZR35gfsJS on chain 2 would be 5 (assuming it was 0 initially). The other 7 chains would not have a record of E1UG2nBnxbKoBuvZt1NQqxkRiZR35gfsJS. However, if an address on chain 8 wanted to send 10 coins to E1UG2nBnxbKoBuvZt1NQqxkRiZR35gfsJS, it could and the balance for E1UG2nBnxbKoBuvZt1NQqxkRiZR35gfsJS on chain 8 would be 10. 2:E1UG2nBnxbKoBuvZt1NQqxkRiZR35gfsJS could send up to 5 coins on chain 2 and 8: E1UG2nBnxbKoBuvZt1NQqxkRiZR35gfsJS could send up to 10 coins on chain 8. Notice the prefixes designating the cardinal chain.
Current block size limits could be maintained. The transactions would be divided among chains over time allowing for much greater scalability. A protocol would have to be determined for wallets and partial nodes(spv,etc.) to discover full nodes on each chain so when a client wants to spend coin on a particular cardinal chain(chain 1, chain 2, chain 3, etc.) it can reach the proper full nodes for that chain. Also, any cardinal chain can split when blocks start getting full.
There are a ton of implementation details but this is the general idea.