I notice that some exchanges, such as Bitstamp, only support withdrawing Ether via a smart contract. On the other hand, many exchanges do not support receiving Ether via smart contract. Why would an exchange not support smart contracts?
Until recently geth didn't have an event or other means to determine when the balance of an address has changed.
A solution is to check if the recipient (ie "to" ) of a transaction is the address you are checking. If "to" is your address then you are receiving funds. This doesn't work when the transfer is done through a contract because the transfer is done with EVM opcode, these are the so called "internal transaction". In those cases "to" is the contract address.
There are solutions to the issue of "internal transaction" but can be complex, and difficult to implement. For example you have to modify geth source code, and port those changes for each new version.
Arguably they could have used a contract to receive funds, and generate events for each transfer (this are easy to track). But I'd guess exchanges usually already have an infraestructure for other coins, and they will prefer to reuse it for Ethereum.