Maybe override the Dictionary.app executable with your own program, but you'd have to implement how it interacts with the rest of the framework
Code:
//! \defgroup Dictionary Dictionary functions
//! \{
// Dictionary functions
char **EnumDictionaries();
int OpenDictionary(const char *name);
void CloseDictionary();
int LookupWord(const char *what, char **word, char **trans);
int LookupWordExact(const char *what, char **word, char **trans);
int LookupPrevious(char **word, char **trans);
int LookupNext(char **word, char **trans);
//! \brief GetWordListWithPrefix get up to maxWords words with given prefix from current dictionary.
//! Function is not reentrant
//! \param prefix - prefix to find words (in utf-8)
//! \param maxWords - maximum words to find (should not be > 255)
//! \param wordList - resulting list of words (in utf-8), caller should not free the list
//! \return number of words found or 0 on error
int GetWordListWithPrefix(const char *prefix_utf8, int maxWords, char ***wordList);
void OpenDictionaryView(iv_wlist *wordlist, const char *dicname);
void OpenControlledDictionaryView(pointer_to_word_hand_t pointer_handler, iv_wlist *wordlist, const char *dicname);
void OpenFastTranslation(pointer_to_word_hand_t pointer_handler, iv_wlist *wordlist, int pos, const char *dicname);
//! \}
OpenNotepad, CreateNote
It's sad, but the built-in app is lacking (navigating between multiple entries for the same word, for instance)