I was able to do what I wanted by installing Karabiner and adding a file here:
$ nano ~/Library/Application\ Support/Karabiner/private.xml
I added the following:
<?xml version="1.0"?>
<root>
<item>
<name>Custom Shortcuts</name>
<item>
<name>Shift + Up = Page Up</name>
<identifier>custom.pageup</identifier>
<autogen>__KeyToKey__ KeyCode::CURSOR_UP, VK_SHIFT | ModifierFlag::NONE, KeyCode::PAGEUP</autogen>
</item>
<item>
<name>Shift + Down = Page Down</name>
<identifier>custom.pagedown</identifier>
<autogen>__KeyToKey__ KeyCode::CURSOR_DOWN, VK_SHIFT | ModifierFlag::NONE, KeyCode::PAGEDOWN</autogen>
</item>
<item>
<name>Shift + Left = Home</name>
<identifier>custom.home</identifier>
<autogen>__KeyToKey__ KeyCode::CURSOR_LEFT, VK_SHIFT | ModifierFlag::NONE, KeyCode::HOME</autogen>
</item>
<item>
<name>Shift + Right = End</name>
<identifier>custom.end</identifier>
<autogen>__KeyToKey__ KeyCode::CURSOR_RIGHT, VK_SHIFT | ModifierFlag::NONE, KeyCode::END</autogen>
</item>
<item>
<name>Shift + Delete = Forward Delete</name>
<identifier>custom.delete</identifier>
<autogen>__KeyToKey__ KeyCode::DELETE, VK_SHIFT | ModifierFlag::NONE, KeyCode::FORWARD_DELETE</autogen>
</item>
</item>
</root>
I then clicked "Reload XML" in Karabiner and selected the new options, which took effect immediately! It seems to simulate the desired keypresses in every app.