How can I create 10-character, unique codes with no collisions, but without being predictable?
$36^{10}$ is approximately 52-bit. Now;

Generate a secret key $k$ for AES-128
Encrypt the rowID with $\text{unique_code} = \operatorname{AES}_k(rowID)$, and assuming that the key never changes.

Since AES with a key selects permutation for all possible permutations from $2^{\ell}$ to $2^{\ell}$, where $\ell$ with a key, then by fixing a key, you fixed a secret permutation. Therefore the output is distinct for every distinct input. It is unpredictable since AES is assumed to be secure against Known-Plaintext Attacks.