First one is when you build just one file (using context menu in Projects tab), it list all targets. If you choose target, that don't contain desired file, Codeblocks application crashes w/o any error message. It would be nice, if that list contains just targets with selected file on current platform.
This is fixed in trunk now, thanks for reporting.
Actually its also a user error: As a file can belong to several projects and within projects to several targets, C::B asks you what target to pick up for single file compilation to obtain the compiler and settings to use. If you pick a target this files does not belong to, C::B cannot decide what to do. Therefore you
have to select a valid target, obviously.
But surely a wrong input should NOT crash C::B...
Concerning the other questions:
I'd rather leave it as it is. The reason is if you think about cross-compiling, a target platform not the same as the platform your are running on might still be a valid and compilable target,if you take cross-gcc on Linux for windows, for example. So anything in a direction of hiding targets would make cross-compiling impossible. The philosophy here is: Keep it simple. The list of targets is not be that large in the end, isn't it?