There's a simplier answer to that: to be case-insensitive, you have to agree to a character encoding first, or write it down somewhere along with the name, and then you need additional code to deal with equivalences between characters in that encoding.
To be case sensitive, *nix-style, is straightforward: you just aren't allowed to use byte 0x00 (C string terminator) and 0x2F ("/" in ASCII encoding) when encoding file names. Everything else is just fine, regardless of encoding (and endianess, just in case you used multibyte characters). To compare names you just compare sequence of bytes up to the C string terminator, and two are names are equal if their bytes are equal. End of it.
This, and the fact that forcing down policies on file naming is a task better suited to user interfaces than kernels or system libraries (this way, an UI can always be as case-insensitive as it wants/needs to be).