There are some factors that may affect this:
An app must explicitly declare that it's preferable/possible to be installed on SD card.
Beginning with API Level 8, you can allow your application to be installed on the external storage (for example, the device's SD card). This is an optional feature you can declare for your application with the
android:installLocation manifest attribute. If you do not declare this attribute, your application will be installed on the internal storage only and it cannot be moved to the external storage.
An app is set to compile using API 7 (Froyo) or lower, which doesn't support installing an app on SD card (even if it's installed on GingerBread or newer devices)
The ability for your application to install on the external storage is a feature available only on devices running API Level 8 (Android 2.2) or greater. Existing applications that were built prior to API Level 8 will always install on the internal storage and cannot be moved to the external storage (even on devices with API Level 8). However, if your application is designed to support an API Level lower than 8, you can choose to support this feature for devices with API Level 8 or greater and still be compatible with devices using an API Level lower than 8.
The reasons why some apps are not preferable to be installed on SD card are as following:
When the user enables USB mass storage to share files with their computer (or otherwise unmounts or removes the external storage), any application installed on the external storage and currently running is killed. The system effectively becomes unaware of the application until mass storage is disabled and the external storage is remounted on the device. Besides killing the application and making it unavailable to the user, this can break some types of applications in a more serious way. In order for your application to consistently behave as expected, you should not allow your application to be installed on the external storage if it uses any of the following features, due to the cited consequences when the external storage is unmounted:
Service will be killed and will not be restarted when external storage is remounted. [...]
Your alarms registered with
AlarmManager will be cancelled. [...]
Input Method Engines
Your IME will be replaced by the default IME. [...]
Your running Live Wallpaper will be replaced by the default Live Wallpaper. [...]
Your App Widget will be removed from the home screen. When external storage is remounted, your App Widget will not be available for the user to select until the system resets the home application (usually not until a system reboot).
Your accounts created with
AccountManager will disappear until external storage is remounted.
AbstractThreadedSyncAdapter and all its sync functionality will not work until external storage is remounted.
DeviceAdminReceiver and all its admin capabilities will be disabled, which can have unforeseeable consequences for the device functionality, which may persist after external storage is remounted.
Broadcast Receivers listening for "boot completed"
The system delivers the
ACTION_BOOT_COMPLETED broadcast before the external storage is mounted to the device. If your application is installed on the external storage, it can never receive this broadcast.
If your application uses any of the features listed above, you should not allow your application to install on external storage.
(Some parts are redacted. They are explaining what developers have to do to make their apps working properly after the SD card is remounted.)
Note: this answer serves as general information to "Why some apps cannot be moved to SD card"
Source: Android Developers: App Install Location.