$$X \longrightarrow \fbox{$\phantom{\int}P_{Y|X}\phantom{\int}$}\longrightarrow Y$$

If $X$'s distribution is fixed, the information capacity of this channel is $I(X;Y)$, and it can be achieved by associating each message with a random codeword so that $m_i \mapsto x^n_i$ where $i=1,\dots,2^{n(I(X;Y)-\varepsilon)},$ with $x^n_i\sim P_{X^n}$ i.i.d. . This collection of codewords is sparse enough in $\mathcal{Y}^n$ up to $P_{Y^n|X^n}$ that each can be uniquely identified from $Y^n.$

You can imagine doing this backwards by finding disjoint collections $\{\mathcal{C}_i\}$ in $Y^n$'s typical set with $P(\mathcal{C}_i)\approx 2^{-n(I(X;Y)-\varepsilon)}$, then sending a message $m_i$ by 'pulling back' $\mathcal{C}_i$ to a distribution in $\mathcal{X}^n$, maybe $P_{X|(Y\in \mathcal{C}_i)}$, and transmitting something drawn from that distribution. 

Most collections $\{\mathcal{C}_i\}$ won't work. What are sufficient conditions or a procedure for generating $\{\mathcal{C}_i\}$ that will produce a working codebook?