If anyone was curious; I ended up actually finding source code for ExtraUtilities and found that the original developer was manually setting the opacity of the block to 255. That was done in 1.12.2, so the translation is a little different for 1.16.2. Anyways, I'd be mad if I came across this post as solved without an answer, so here's a detailed answer/explanation:
To make a block see-through, but not let light through, you must override the getOpacity method and make it return 255. This makes the block "opaque," while still allowing the player to see through.
To solve rendering culling issues, you must also override the isSideInvisible method, and make it return true only if the adjacentBlockState matches this block's state.
In code, the following two overrides look like this:
@Override
public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, direction side) {
// if the adjacentBlock is this block, side should be invisible. else, false
return adjacentBlockState.isIn(this) ? true : false;
}
@Override
public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) {
// NOTE: I'm not sure if this really has to be 255, or if there's a lower value at which this blocks all light.
return 255;
}
Additionally, in the creation of the Block's properties, you should tack .notSolid() onto the list.