Instead of calling the modal function directly, create a method called modal on your scope and bind it using ngClick.
Modal should really be a directive because it manipulates the DOM, but in short the reason why you aren't seeing the {{i}} resolve is because the HTML is not compiled. Angular compiles HTML it knows about, but in this example you created a new block of HTML outside of Angular.
From the controller, you could create the method to build it up, and do something like this:
// create a scope from the modal that inherits from the parent scope because it accesses properties there
var modalScope = $scope.new();
// be sure to inject the compiler service: function($scope,$location,$http,$compile)
var element = angular.element(modal_content);
$compile(element.contents())(modalScope);
Although that should work, it would be better if you considered creating a directive for the modal instead.