this is not very difficult to do. In a visual studio addin you code an DebuggerEvents.OnEnterBreakMode event handler.
_debugEvents = _applicationObject.Events.DebuggerEvents;
Your addin creates a ToolWindow that hosts a WPF user control ( which in turn contains a Canvas ).
The OnEnterBreakMode event handler accesses the Debugger.CurrentStackFrame from the DTE2 application object:
var sf = _applicationObject.Debugger.CurrentStackFrame;
From the StackFrame you get a collection of Expression from the Arguments and Locals collections:
foreach (var item in sf.Locals)
if (item is EnvDTE.Expression)
var exprItem = item as EnvDTE.Expression;
Hooking up to the code on the call stack I assume is done with Project Roslyn.
Working with the values of the variables is a bit limited in my experience. The Expression object.Value property only returns the ToString( ) contents of an object and its members.